from django.db.models import F
from django.http import HttpResponseRedirect
from django.shortcuts import get_object_or_404, render
from django.urls import reverse
from django.views import generic

from .models import Choice, Question
from django.utils import timezone

class IndexView(generic.ListView):
    model = Question  # 关键配置
    template_name = "polls/index.html"
    context_object_name = "latest_question_list"

def get_queryset(self):
    """
    Return the last five published questions (not including those set to be
    published in the future).
    """
    return Question.objects.filter(pub_date__lte=timezone.now()).order_by("-pub_date")[
        :5
    ]


class DetailView(generic.DetailView):
    model = Question
    template_name = "polls/detail.html"

    def get_queryset(self):
        """
        Excludes any questions that aren't published yet.
        """
        return Question.objects.filter(pub_date__lte=timezone.now())

class ResultsView(generic.DetailView):
    model = Question
    template_name = "polls/results.html"


def vote(request, question_id):
    question = get_object_or_404(Question, pk=question_id)
    try:
        selected_choice = question.choice_set.get(pk=request.POST['choice'])
    except (KeyError, Choice.DoesNotExist):
        # 表单验证失败时返回原页面并显示错误
        return render(request, 'polls/detail.html', {
            'question': question,
            'error_message': "请选择一个选项。",
        })
    else:
        selected_choice.votes += 1
        selected_choice.save()
        # 成功提交后重定向到结果页
        return HttpResponseRedirect(reverse('polls:results', args=(question.id,)))